8
תגובות

מה יותר מהיר ??

פתח משתמש_242343 ,
אני עושה ככה לבדיקת משתמש..
$check=mysql_query("SELECT username,password from users WHERE username='$user' AND password='$pass' LIMIT 1");
$row=mysql_fetch_row($check);
if($row[0]==$user&&$row[1]==$pass)

הוספתי IF כדי לבדוק אותיות גדולות וקטנות..
אני לא יודע אם כדאי לי להמיר לBIN כל פעם כי זה יאט את הבדיקה שרצה כל פעם..
יש אולי משהו אחר?


אני עושה גם בדיקה של הודעות פרטיות..
SELECT COUNT(*) as n from private WHERE sendto='$username' AND Visibility='f'

מה יותר מהיר ובכלל ההבדל:
SELECT COUNT(id) as n from private WHERE sendto='$username' AND Visibility='f'

במידה והID הוא PRIMARY (אינו NULL), האם זה יאיץ את ביצועי המסד?

8 תשובות

avatar ענה intval ב 18 ליוני 2012 #

אם אתה לא עושה שליפה לפי id אז את השליפה לא מעיניין בכלל שה-id הוא primary
שנית עם שדה הוא primary זה אוטומטית אומר שאינו null.
למה החלטת של bin יאט את השליפה?
ורביעית, אתה חייב להפסיק עם זה, עם האופטימיזציות האלה. השאלות האלה הם מסוג
האוטו יהיה יותר מהיר אם אני ינפח את הגלגל של האותו ב 31 אטמוספרות או 31.00001 ?
אתה צריך להבין שכל מה ששאלת עד עכשיו, פרט לשימוש באינדקסים היה מהסוג הזה.

מה שאתה עושה עכשיו, זה מתקין xdebug, מוריד WinCacheGrind מפעיל את הסקריפט שלך
ורואה לבד כמה מילישניות לוקח לאיזה פונקציה להתבצע, באיזה סדר הם מתבצעות ומה החלקים האיטיים.
רק אחרי שאתה מגלה את החלקים האיטיים במערכת - אתה חושב איך ליעל אותם. מכל השאר אתה מתעלים לחלוטין.

p.s בכלל לא ברור בשביל מה אתה בודק את גודל האותיות. מה איכפת לך ש admin ו aDmin ייחשבו לאותו משתמש
ולא יהיו לך שני משתמשים שונים במערכת, אחד admin והשני AdMiN

avatar ענה itamarhadad ב 18 ליוני 2012 #

אמרתי לך שאני מפחד מדברים שיתקעו לי את האתר..
והקוד הזה רץ בקביעות..

ולגבי האותיות הגדולות זה בגלל שאני רוצה שהשם משתמש יוצג כפי שהוכנס..
ועד עכשיו כשאני אני מכניס לשרת אשכול /הודעה /כל דבר אחר אני מכניס את הקוקי בדיוק..

ולגבי השאלה חחחחח

SELECT COUNT(id) as n from private WHERE sendto='$username' AND Visibility='f'

נראה לי שזה יהיה יותר מהיר, מכוון שב* הוא בודק את כל העמודות אם הם קיימות וערכם לא NULL
וכאן הוא בודק את ID שהוא בטוח לא NULL
מה אתה אומר?
ולגבי הBIN זה יאט כי הוא ממיר את זה ולוקח זמן להמיר מTEXT לBIN ..
אז נראה לי שIF יהיה הכי מהיר..

חחח אני יודע שזה שזה שאלות מפגרות אבל זה מפריע לי להוסיף משהו לאתר ובעצם ככה אני מאט את האתר ואז לא הרווחתי כלום ,כמו עם האיפוס ID AUTO INCERMENT שעדיין מפריע לי לראות אותו גדל בלי שהוא מתאפס וככל שהוא גדול יותר צריך לחשב יותר..

avatar ענה iiddaannyy ב 18 ליוני 2012 #

בנוגע לאותיות גדולות/קטנות, תעשה ככה:

$q = mysql_query("SELECT `username` FROM `users` WHERE `username`='$user' AND `password`='$pass' LIMIT 1");
if ($r = mysql_fetch_row($q)) {
    echo "hello {$r[0]}";
}
else {
    echo 'wrong!';
}

ככה שאתה שולף את המשתמש מהמסד תוך כדי הבדיקה ואתה מקבל ב-[0]r$ את שם המשתמש + אותיות קטנות/גדולות.
בנוגע לסיסמה, היא אמורה להיות מוצפנת אצלך במסד. ההצפנה מתייחסת לאותיות גדולות/קטנות. ה-md5 של האות A שונה מזה של האות a. ככה שאל תדאג, אם המשתמש לא הקפיד על אותיות גדולות/קטנות לא תהיה התאמה במסד.

בנוגע להודעות הפרטיות:
SELECT COUNT(`id`) AS `n` FROM `private` WHERE `sendto`='$username' AND `Visibility`='f'

avatar ענה iiddaannyy ב 18 ליוני 2012 #

ד"א, אל תשכח להצפין את המשתנה pass לפי ההצפנה שהסיסמה מוצפנת במסד.
ואם אתה רוצה להרוויח עוד טיפה, תעשה את ההצפנה בשאילתה עצמה.

avatar ענה itamarhadad ב 18 ליוני 2012 #

מה זה הצפנה?
ולמה אני צריך את זה? מה החסרונות?

avatar ענה iiddaannyy ב 18 ליוני 2012 #

לא ממש הצפנה, יותר פונקצית גיבוב.
היא הופכת את מה שאתה מכניס לה למחרוזת תווים, חסרת משמעות, בעל אורך קבוע לכל קלט ושאינה ניתנת להפיכה (לפחות לא בצורה מעשית).
אתה וודאי מכיר פונקציות כאלה, כמו md5, sha וכו'.

למה להשתמש בזה? כדי שבמקרה ומישהו יצליח להכנס למסד שלך ולראות את כל הפרטים של המשתמשים אז הוא לא יוכל לדעת מה הסיסמאות של כל אחד. הוא יראה רק את המחרוזת לאחר הגיבוב, אבל הוא לא יהיה יכול לגלות את הסיסמאות.

avatar ענה itamarhadad ב 18 ליוני 2012 #

אהה הבנתי ..
אבל סתם שאלה מה ההסתברות שדבר כזה יקרה? הרי זה לא כל כך פשוט

בכל מקרה חשבתי לעשות את זה לקוקי כי כעושים בדוק מרכיב רואים את הסיסמא לגמרי..
אבל שמעתי היום על HTTPONLY ואני חושב שהוא יעזור לבעיה הזאת..
http://phpguide.co.il/q675/HTTPONLY.htm

ולגבי השאילתות שלי שמתי לב שהשתמשת ב" ` " לפני כל עמודה..
את האמת בדקתי,וגם בלי זה השאילתה עובדת, מתי היא עושה בעיות כאשר שם העמודה הוא:
WHEN
WHRE
וכו'.. ככה שאין בעיה בלי

avatar ענה iiddaannyy ב 18 ליוני 2012 #

ההסתברות של זה היא לא קטנה. לא חובה שמישהו יגיע לך ישירות למסד. יכול להיות איזה חור אבטחה, לדוגמהsql injection שבעזרתו אפשר לשלוף את כל הסיסמאות מכל המשתמשים.
אבל אם לא תכניס את הסיסמאות למסד כמו שהן, אלא אחרי גיבוב, גם אחרי שישלפו אותן לא יהיה מה לעשות איתן.

עדיין. קודם כל, במקרה שיש כמה משתמשים על אותו מחשב, אחד מהמשתמשים יכול להסתכל בעוגיות של השני ולגלות את הסיסמה שלו. דבר שני, httponly זו אופצייה שקיימת בדפדפנים היותר מודרניים. אם מישהו יכנס לאתר שלך עם דפדפן ישן יותר האופצייה הזו לא חלה עליו.

זה עובד גם בלי. אבל ככה אתה עוזר למסד.
לפי הסינטקס של sql כל שם של עמודה/טבלה צריכה להתחם בגרש הפוכה `.
כשאתה עובד לפי הסינטקס שאומר שמחרוזות יהיו בגירשיים ושמות של טבלאות/עמודות בגרש הפוכה, המסד מבין יותר טוב מה אתה רוצה ממנו והוא לא צריך להתחיל "לנחש" למה התכוונת בשאילתה.